#!/usr/bin/python
#vim:fileencoding=utf-8
"""
Модуль содержит класс Understander, который будет понимать
предложения. Он разбивает предложения на слова и строит по ним
мысль, используя грамматику языка.

На первом этапе не учитывает пунктуацию.
"""
if __name__ == '__main__':
    import os, sys
    src_dir = os.path.join('..', '..')
    sys.path.append(src_dir)
    sys.path.append('.')

import itertools
import re

from gnTai.aiexception import AIException
from gnTai.usefull_staff import constants
from grammar import Parser
from dictionary import Dictionary

class Struct:
    def __init__(self, **kwargs):
        for attr in kwargs:
            setattr(self, attr, kwargs[attr])

class Understander:
    def __init__(self, dictionary_file_name='', dictionary=None):
        if dictionary_file_name:
            self.dictionary = Dictionary.load_from_file(dictionary_file_name)
        elif dictionary:
            self.dictionary = dictionary
        else:
            raise AIException(
                    "Вы должны указать один из параметров dictionary_file_name или dictionary"
                    )

    def clear_sentence(self, sentence):
        """
        Очищает предложение от левых знаков препинания.
        """
        return re.sub('([,.!?])', ' \\1 ',  sentence).lower()

    def word_to_forms(self, string):
        result = []
        for word in self.dictionary[string]:
            for form in word.forms(string):
                form = word.get_type() + str(form)
                result.append(Struct(form=form, word=word))
        return result


    def parse_sentence(self, sentence):
        sentence = self.clear_sentence(sentence)
        words = sentence.strip().split()
        variants = [self.word_to_forms(word) for word in words]
        for variant in itertools.product(*variants):
            syntax = ' '.join(v.form for v in variant)
            words = [v.word for v in variant]
            try:
                builder = Parser.parse(syntax)
                thought = builder.build(words)
                # TODO какой-то подходящий выбор мысли а не возврат первого же успеха
                return thought
            except:
                raise

    understand = parse_sentence

if __name__ == '__main__':
    import os, sys
    src_dir = os.path.join('..', '..')
    sys.path.append(src_dir)
    sys.path.append('.')
    u = Understander(constants.DICTIONARY_TEST_PATH)
    print u.clear_sentence('I love Nata so much.')
    thought =  u.parse_sentence('Apple exists.')
    thought.set_question(True)
    print thought
